import request from '@/utils/request';

const File_BASE_URL = '/admin/sys-file';

const FileAPI = {
  /**
   * 分页查询文件
   *
   * @param queryParams 查询参数（可选）
   * @returns 文件树形表格数据
   */
  getList(queryParams?: any) {
    return request<any, FileVO[]>({
      url: `${File_BASE_URL}/page`,
      method: 'get',
      params: queryParams,
    });
  },
  getListAll() {
    return request<any, FileVO[]>({
      url: `${File_BASE_URL}/list`,
      method: 'get',
    });
  },

  /**
   * 新增文件/文件上传
   *
   * @param data 文件表单数据
   * @returns 请求结果
   */
  create(data: any) {
    return request({
      url: `${File_BASE_URL}/upload`,
      method: 'post',
      data,
      headers: {
        'Content-Type': 'multipart/form-data',
        'Access-Control-Allow-Origin': '*',
      },
    });
  },

  /**
   * 删除文件
   *
   * @param ids 文件ID，多个以英文逗号(,)分隔
   * @returns 请求结果
   */
  deleteByIds(ids: number[] | string[]) {
    return request({
      url: `${File_BASE_URL}/delete`,
      method: 'post',
      data: ids,
    });
  },

  /**
   * 批量获取文件信息
   * @returns
   */
  getBatchFileList(data: number[] | string[]) {
    return request<any, FileVO[]>({
      url: `${File_BASE_URL}/batch`,
      method: 'post',
      data,
    });
  },

  // 根据ID下载文件
  downloadFile(fileId: string, fileName?: string, flag?: boolean) {
    return request({
      url: `${File_BASE_URL}/download/${fileId}`,
      method: 'get',
      responseType: 'blob',
    }).then((res) => {
      const blob = new Blob([res.data]);
      if (flag) {
        return blob;
      }
      const a = document.createElement('a');
      const url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = fileName || '下载文件';
      a.click();
      window.URL.revokeObjectURL(url);
      a.remove();
    });
  },
};

export default FileAPI;

/** 文件类型 */
export interface FileVO {
  /** 文件ID */
  id?: number;
  /** 文件名称 */
  fileName?: string;
  /** 文件存储桶 */
  bucketName?: string;
  /** 原始文件名 */
  original?: string;
  /** 文件大小 */
  fileSize?: number;
  /** 文件类型 */
  type?: string;
  /** 修改时间 */
  updateTime?: string;
  /** 创建人 */
  createBy?: string;
  /** 修改人 */
  updateBy?: string;
  /** 创建时间 */
  createTime?: string;
}
